package xyz.heyaoshare.config.websocket.chat;

import jakarta.validation.constraints.NotNull;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;

import java.net.URI;
import java.util.Map;

/**
 * 自定义握手拦截器
 * @author YueHe
 * @version 0.0.1
 * @since 2025/6/25 下午1:33
 */
public class ChatHandshakeInterceptor implements HandshakeInterceptor {

    /**
     * 在WebSocket握手之前执行的方法。
     *
     * @param request    HTTP请求对象，包含客户端发送的请求信息。
     * @param response   HTTP响应对象，用于构建发送给客户端的响应。
     * @param wsHandler  WebSocket处理器，用于处理WebSocket会话。
     * @param attributes 用于存储握手过程中需要的额外属性的Map。
     * @return 如果返回true，则继续握手过程；如果返回false，则中断握手过程。
     * @throws Exception 如果握手过程中发生异常，则抛出该异常。
     */
    @Override
    public boolean beforeHandshake(@NotNull ServerHttpRequest request,
                                   @NotNull ServerHttpResponse response,
                                   @NotNull WebSocketHandler wsHandler,
                                   @NotNull Map<String, Object> attributes) throws Exception {
        URI uri = request.getURI(); // 获取请求的URI
        String query = uri.getQuery(); // 获取URI中的查询字符串
        if (query != null) { // 如果查询字符串不为空
            String[] pairs = query.split("&"); // 使用"&"分割查询字符串为键值对数组
            for (String pair : pairs) { // 遍历键值对数组
                int idx = pair.indexOf("="); // 查找"="的位置
                if (idx > 0) { // 如果找到了"="
                    String key = pair.substring(0, idx); // 提取键
                    String value = pair.substring(idx + 1); // 提取值
                    if ("userId".equals(key)) { // 如果键是"userId"
                        attributes.put("userId", value); // 将值存入attributes中，键为"userId"
                        break; // 找到后跳出循环
                    }
                }
            }
        }
        return true; // 返回true，继续握手过程
    }

    /**
     * 重写afterHandshake方法以处理WebSocket握手后的操作。
     * <p>
     * 可以在这个方法中执行一些握手后的操作，例如记录日志、验证用户身份、修改响应头等。
     * 如果不需要执行任何操作，则此方法可以留空。
     *
     * @param request   表示客户端请求的ServerHttpRequest对象，不能为null。
     * @param response  表示服务器响应的ServerHttpResponse对象，不能为null。
     * @param wsHandler WebSocket处理器，用于处理WebSocket连接，不能为null。
     * @param exception 如果在握手过程中发生异常，则此参数包含异常信息；否则为null。
     */
    @Override
    public void afterHandshake(@NotNull ServerHttpRequest request,
                               @NotNull ServerHttpResponse response,
                               @NotNull WebSocketHandler wsHandler,
                               Exception exception) {
        // 可以在这里执行一些握手后的操作，如果需要的话
    }

}